package com.fsh.anime.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fsh.anime.common.FanjuConstant;
import com.fsh.anime.mapper.FanjuMapper;
import com.fsh.anime.minio.FileStorageService;
import com.fsh.anime.model.dtos.FanjuDto;
import com.fsh.anime.model.dtos.PageFanjuDto;
import com.fsh.anime.model.dtos.PageFanjuDto2;
import com.fsh.anime.model.pojos.Fanju;
import com.fsh.anime.model.vos.PageResult;
import com.fsh.anime.model.vos.Result;
import com.fsh.anime.service.FanjuService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;

@Service
@Slf4j
public class FanjuServiceImpl extends ServiceImpl<FanjuMapper, Fanju> implements FanjuService {

    @Autowired
    private FanjuMapper fanjuMapper;
    @Autowired
    private FileStorageService fileStorageService;

    /**
     * 分页获取动漫列表
     *
     * @param dto dto
     * @return {@link Result}
     */
    @Override
    public Result getAnimes(PageFanjuDto dto) {
        if(dto==null||dto.getCurrentPage()==null||dto.getPageSize()==null||dto.getCountry()==null){
            return Result.error("无效参数");
        }
        IPage page=new Page(dto.getCurrentPage(),dto.getPageSize());

        LambdaQueryWrapper<Fanju> lambdaQueryWrapper=new LambdaQueryWrapper<>();
        if(dto.getStatus()!=null&&dto.getStatus()!=2){
            lambdaQueryWrapper.eq(Fanju::getStatus,dto.getStatus());
        }
        String country="";
        if(dto.getCountry().equals("chinese")){
            country="国产";
        }else if(dto.getCountry().equals("japanese")){
            country="日本";
        }else if(dto.getCountry().equals("other")){
            country="其他";
        }
        lambdaQueryWrapper.eq(Fanju::getCountry,country);
        lambdaQueryWrapper.like(dto.getKeywords()!=null&&dto.getKeywords()!="",Fanju::getName,dto.getKeywords());
        lambdaQueryWrapper.orderByDesc(Fanju::getPubTime);
        IPage page1 = fanjuMapper.selectPage(page, lambdaQueryWrapper);
        PageResult pageResult=new PageResult();
        pageResult.setRecords(page1.getRecords());
        pageResult.setTotal(page1.getTotal());
        return Result.success(pageResult);
    }

    /**
     * 更新动漫状态
     *
     * @param id     id
     * @param status 状态
     * @return {@link Result}
     */
    @Override
    public Result updateAnimeStatus(Integer id, Integer status) {
        if(id==null || status==null){
            return Result.error("无效参数");
        }
        Fanju fanju=new Fanju();
        fanju.setId(id);
        fanju.setStatus(status);
        fanjuMapper.updateById(fanju);
        return Result.success("更新成功");
    }

    /**
     * 删除动漫
     *
     * @param id id
     * @return {@link Result}
     */
    @Override
    public Result delAnime(Integer id,String cover) {
        if(id==null){
            return Result.error("无效参数");
        }
        //status=1,上架中的不能删除。
        Fanju fanju = fanjuMapper.selectById(id);
        if(fanju.getStatus()==1){
            return Result.error("'上架' 中的番剧不能删除!");
        }

        fanjuMapper.deleteById(id);
        fileStorageService.delete(cover);
        return Result.success("删除成功");
    }

    /**
     * 添加动画
     *
     * @param dto dto
     * @return {@link Result}
     */
    @Override
    @Transactional
    public Result addAnime(FanjuDto dto) {
        //没有id是新增
        if(dto.getId()==null){
            dto.setStatus(1);
            dto.setLike(50);
            fanjuMapper.insert(dto);
            return Result.success("添加成功");
        }
        //有id是更新
        Fanju fanju = fanjuMapper.selectById(dto.getId());
        log.info("{}",fanju);
        //如果数据库 原来的cover不为空
//        if(fanju.getCover()!=null && !fanju.getCover().equals("")){
        if(fanju.getCover()!=null && StringUtils.isNotBlank(fanju.getCover())){
            if(fanju.getCover().equals(dto.getCover())){
                //封面图片没有更换。 那就直接更新
                fanjuMapper.updateById(dto);
            }else{
                //封面图片已经更换,先删除原来的图片。再更新
                fanjuMapper.updateById(dto);
                fileStorageService.delete(fanju.getCover());
            }
        }else{
            //如果数据库 原来的cover为空
            //直接更新
            fanjuMapper.updateById(dto);
        }
        return Result.success("更新成功");
    }

    /**
     * 上传图片
     *
     * @param file 文件
     */
    @Override
    public String upload(MultipartFile file) {
        //获取原始文件名
        String originalFilename = file.getOriginalFilename();
        log.info("图片：，{}",originalFilename);
        //获取文件的扩展名（截取字符串）
        String extension = originalFilename.substring(originalFilename.lastIndexOf("."));
        //用uuid构造新的文件名+扩展名
        String newFileName= UUID.randomUUID().toString()+extension;
//        System.out.println(newFileName);
        String imgPath=null;
        InputStream is = null;
        //上传图片到minio
        try {
            is = file.getInputStream();
            imgPath = fileStorageService.uploadImgFile("", newFileName,is);
            System.out.println("图片的路径为："+imgPath);
        } catch (IOException e) {
            e.printStackTrace();
            return "文件上传失败";
        }finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return imgPath;
    }

    //-----------------------

    /**
     * 得到所有番剧
     *
     * @return {@link Result}
     */
    @Override
    public Result getAllFanju(PageFanjuDto2 dto) {
        //自动校验参数
        IPage page=new Page(dto.getCurrentPage(), dto.getPageSize());
        LambdaQueryWrapper<Fanju> lambdaQueryWrapper=new LambdaQueryWrapper<>();
        //只查 上架的番剧
        lambdaQueryWrapper.eq(Fanju::getStatus, FanjuConstant.FANJU_STATUS_1);
        //名字匹配
        lambdaQueryWrapper.like(dto.getKeywords()!=null && dto.getKeywords()!="",Fanju::getName,dto.getKeywords());
        IPage page1 = fanjuMapper.selectPage(page, lambdaQueryWrapper);
        PageResult pageResult=new PageResult();
        pageResult.setTotal(page1.getTotal());
        pageResult.setRecords(page1.getRecords());
        return Result.success(pageResult);
    }
}
